[ ]:
# Googleドライブをマウント
from google.colab import drive
drive.mount('/content/gdrive')
[ ]:
# Open3Dをインストール
!pip install open3d
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Requirement already satisfied: open3d in /usr/local/lib/python3.8/dist-packages (0.16.0)
Requirement already satisfied: numpy>1.15 in /usr/local/lib/python3.8/dist-packages (from open3d) (1.21.6)
Requirement already satisfied: matplotlib>=3 in /usr/local/lib/python3.8/dist-packages (from open3d) (3.2.2)
Requirement already satisfied: pyquaternion in /usr/local/lib/python3.8/dist-packages (from open3d) (0.9.9)
Requirement already satisfied: nbformat==5.5.0 in /usr/local/lib/python3.8/dist-packages (from open3d) (5.5.0)
Requirement already satisfied: dash>=2.6.0 in /usr/local/lib/python3.8/dist-packages (from open3d) (2.8.1)
Requirement already satisfied: ipywidgets>=7.6.0 in /usr/local/lib/python3.8/dist-packages (from open3d) (7.7.1)
Requirement already satisfied: tqdm in /usr/local/lib/python3.8/dist-packages (from open3d) (4.64.1)
Requirement already satisfied: addict in /usr/local/lib/python3.8/dist-packages (from open3d) (2.4.0)
Requirement already satisfied: pandas>=1.0 in /usr/local/lib/python3.8/dist-packages (from open3d) (1.3.5)
Requirement already satisfied: configargparse in /usr/local/lib/python3.8/dist-packages (from open3d) (1.5.3)
Requirement already satisfied: pyyaml>=5.4.1 in /usr/local/lib/python3.8/dist-packages (from open3d) (6.0)
Requirement already satisfied: pillow>=8.2.0 in /usr/local/lib/python3.8/dist-packages (from open3d) (9.4.0)
Requirement already satisfied: scikit-learn>=0.21 in /usr/local/lib/python3.8/dist-packages (from open3d) (1.0.2)
Requirement already satisfied: fastjsonschema in /usr/local/lib/python3.8/dist-packages (from nbformat==5.5.0->open3d) (2.16.2)
Requirement already satisfied: jupyter_core in /usr/local/lib/python3.8/dist-packages (from nbformat==5.5.0->open3d) (5.2.0)
Requirement already satisfied: traitlets>=5.1 in /usr/local/lib/python3.8/dist-packages (from nbformat==5.5.0->open3d) (5.7.1)
Requirement already satisfied: jsonschema>=2.6 in /usr/local/lib/python3.8/dist-packages (from nbformat==5.5.0->open3d) (4.3.3)
Requirement already satisfied: plotly>=5.0.0 in /usr/local/lib/python3.8/dist-packages (from dash>=2.6.0->open3d) (5.5.0)
Requirement already satisfied: Flask>=1.0.4 in /usr/local/lib/python3.8/dist-packages (from dash>=2.6.0->open3d) (1.1.4)
Requirement already satisfied: dash-table==5.0.0 in /usr/local/lib/python3.8/dist-packages (from dash>=2.6.0->open3d) (5.0.0)
Requirement already satisfied: dash-core-components==2.0.0 in /usr/local/lib/python3.8/dist-packages (from dash>=2.6.0->open3d) (2.0.0)
Requirement already satisfied: dash-html-components==2.0.0 in /usr/local/lib/python3.8/dist-packages (from dash>=2.6.0->open3d) (2.0.0)
Requirement already satisfied: widgetsnbextension~=3.6.0 in /usr/local/lib/python3.8/dist-packages (from ipywidgets>=7.6.0->open3d) (3.6.2)
Requirement already satisfied: ipykernel>=4.5.1 in /usr/local/lib/python3.8/dist-packages (from ipywidgets>=7.6.0->open3d) (5.3.4)
Requirement already satisfied: ipython>=4.0.0 in /usr/local/lib/python3.8/dist-packages (from ipywidgets>=7.6.0->open3d) (7.9.0)
Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /usr/local/lib/python3.8/dist-packages (from ipywidgets>=7.6.0->open3d) (3.0.5)
Requirement already satisfied: ipython-genutils~=0.2.0 in /usr/local/lib/python3.8/dist-packages (from ipywidgets>=7.6.0->open3d) (0.2.0)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.8/dist-packages (from matplotlib>=3->open3d) (3.0.9)
Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.8/dist-packages (from matplotlib>=3->open3d) (2.8.2)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.8/dist-packages (from matplotlib>=3->open3d) (0.11.0)
Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.8/dist-packages (from matplotlib>=3->open3d) (1.4.4)
Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.8/dist-packages (from pandas>=1.0->open3d) (2022.7.1)
Requirement already satisfied: scipy>=1.1.0 in /usr/local/lib/python3.8/dist-packages (from scikit-learn>=0.21->open3d) (1.7.3)
Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.8/dist-packages (from scikit-learn>=0.21->open3d) (1.2.0)
Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.8/dist-packages (from scikit-learn>=0.21->open3d) (3.1.0)
Requirement already satisfied: itsdangerous<2.0,>=0.24 in /usr/local/lib/python3.8/dist-packages (from Flask>=1.0.4->dash>=2.6.0->open3d) (1.1.0)
Requirement already satisfied: Werkzeug<2.0,>=0.15 in /usr/local/lib/python3.8/dist-packages (from Flask>=1.0.4->dash>=2.6.0->open3d) (1.0.1)
Requirement already satisfied: click<8.0,>=5.1 in /usr/local/lib/python3.8/dist-packages (from Flask>=1.0.4->dash>=2.6.0->open3d) (7.1.2)
Requirement already satisfied: Jinja2<3.0,>=2.10.1 in /usr/local/lib/python3.8/dist-packages (from Flask>=1.0.4->dash>=2.6.0->open3d) (2.11.3)
Requirement already satisfied: tornado>=4.2 in /usr/local/lib/python3.8/dist-packages (from ipykernel>=4.5.1->ipywidgets>=7.6.0->open3d) (6.2)
Requirement already satisfied: jupyter-client in /usr/local/lib/python3.8/dist-packages (from ipykernel>=4.5.1->ipywidgets>=7.6.0->open3d) (6.1.12)
Requirement already satisfied: setuptools>=18.5 in /usr/local/lib/python3.8/dist-packages (from ipython>=4.0.0->ipywidgets>=7.6.0->open3d) (57.4.0)
Requirement already satisfied: pexpect in /usr/local/lib/python3.8/dist-packages (from ipython>=4.0.0->ipywidgets>=7.6.0->open3d) (4.8.0)
Requirement already satisfied: pygments in /usr/local/lib/python3.8/dist-packages (from ipython>=4.0.0->ipywidgets>=7.6.0->open3d) (2.6.1)
Requirement already satisfied: prompt-toolkit<2.1.0,>=2.0.0 in /usr/local/lib/python3.8/dist-packages (from ipython>=4.0.0->ipywidgets>=7.6.0->open3d) (2.0.10)
Requirement already satisfied: jedi>=0.10 in /usr/local/lib/python3.8/dist-packages (from ipython>=4.0.0->ipywidgets>=7.6.0->open3d) (0.18.2)
Requirement already satisfied: backcall in /usr/local/lib/python3.8/dist-packages (from ipython>=4.0.0->ipywidgets>=7.6.0->open3d) (0.2.0)
Requirement already satisfied: pickleshare in /usr/local/lib/python3.8/dist-packages (from ipython>=4.0.0->ipywidgets>=7.6.0->open3d) (0.7.5)
Requirement already satisfied: decorator in /usr/local/lib/python3.8/dist-packages (from ipython>=4.0.0->ipywidgets>=7.6.0->open3d) (4.4.2)
Requirement already satisfied: attrs>=17.4.0 in /usr/local/lib/python3.8/dist-packages (from jsonschema>=2.6->nbformat==5.5.0->open3d) (22.2.0)
Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /usr/local/lib/python3.8/dist-packages (from jsonschema>=2.6->nbformat==5.5.0->open3d) (0.19.3)
Requirement already satisfied: importlib-resources>=1.4.0 in /usr/local/lib/python3.8/dist-packages (from jsonschema>=2.6->nbformat==5.5.0->open3d) (5.10.2)
Requirement already satisfied: six in /usr/local/lib/python3.8/dist-packages (from plotly>=5.0.0->dash>=2.6.0->open3d) (1.15.0)
Requirement already satisfied: tenacity>=6.2.0 in /usr/local/lib/python3.8/dist-packages (from plotly>=5.0.0->dash>=2.6.0->open3d) (8.2.1)
Requirement already satisfied: notebook>=4.4.1 in /usr/local/lib/python3.8/dist-packages (from widgetsnbextension~=3.6.0->ipywidgets>=7.6.0->open3d) (6.3.0)
Requirement already satisfied: platformdirs>=2.5 in /usr/local/lib/python3.8/dist-packages (from jupyter_core->nbformat==5.5.0->open3d) (3.0.0)
Requirement already satisfied: zipp>=3.1.0 in /usr/local/lib/python3.8/dist-packages (from importlib-resources>=1.4.0->jsonschema>=2.6->nbformat==5.5.0->open3d) (3.13.0)
Requirement already satisfied: parso<0.9.0,>=0.8.0 in /usr/local/lib/python3.8/dist-packages (from jedi>=0.10->ipython>=4.0.0->ipywidgets>=7.6.0->open3d) (0.8.3)
Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib/python3.8/dist-packages (from Jinja2<3.0,>=2.10.1->Flask>=1.0.4->dash>=2.6.0->open3d) (2.0.1)
Requirement already satisfied: argon2-cffi in /usr/local/lib/python3.8/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.0->open3d) (21.3.0)
Requirement already satisfied: nbconvert in /usr/local/lib/python3.8/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.0->open3d) (5.6.1)
Requirement already satisfied: Send2Trash>=1.5.0 in /usr/local/lib/python3.8/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.0->open3d) (1.8.0)
Requirement already satisfied: prometheus-client in /usr/local/lib/python3.8/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.0->open3d) (0.16.0)
Requirement already satisfied: terminado>=0.8.3 in /usr/local/lib/python3.8/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.0->open3d) (0.13.3)
Requirement already satisfied: pyzmq>=17 in /usr/local/lib/python3.8/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.0->open3d) (23.2.1)
Requirement already satisfied: wcwidth in /usr/local/lib/python3.8/dist-packages (from prompt-toolkit<2.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets>=7.6.0->open3d) (0.2.6)
Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.8/dist-packages (from pexpect->ipython>=4.0.0->ipywidgets>=7.6.0->open3d) (0.7.0)
Requirement already satisfied: argon2-cffi-bindings in /usr/local/lib/python3.8/dist-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.0->open3d) (21.2.0)
Requirement already satisfied: bleach in /usr/local/lib/python3.8/dist-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.0->open3d) (6.0.0)
Requirement already satisfied: mistune<2,>=0.8.1 in /usr/local/lib/python3.8/dist-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.0->open3d) (0.8.4)
Requirement already satisfied: testpath in /usr/local/lib/python3.8/dist-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.0->open3d) (0.6.0)
Requirement already satisfied: defusedxml in /usr/local/lib/python3.8/dist-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.0->open3d) (0.7.1)
Requirement already satisfied: entrypoints>=0.2.2 in /usr/local/lib/python3.8/dist-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.0->open3d) (0.4)
Requirement already satisfied: pandocfilters>=1.4.1 in /usr/local/lib/python3.8/dist-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.0->open3d) (1.5.0)
Requirement already satisfied: cffi>=1.0.1 in /usr/local/lib/python3.8/dist-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.0->open3d) (1.15.1)
Requirement already satisfied: webencodings in /usr/local/lib/python3.8/dist-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.0->open3d) (0.5.1)
Requirement already satisfied: pycparser in /usr/local/lib/python3.8/dist-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets>=7.6.0->open3d) (2.21)
[ ]:
# Open3Dのバージョン確認 (Ver 0.16.0以上であるのを確認します)
import open3d as o3d
o3d.__version__
'0.16.0'
[ ]:
# Open3DとNumpy などをインポートします
import os
import open3d as o3d
import numpy as np
import copy
[ ]:
# 3次元モデル読み込み
file_path = "/content/gdrive/MyDrive/dataset/image_in/fire_hydrant.ply"   # ファイルパスを設定
fp_mesh = o3d.io.read_triangle_mesh(file_path)  # メッシュデータ読み込み
o3d.visualization.draw_plotly([fp_mesh])  # メッシュデータ表示
[ ]:
# 法線ベクトルを計算
fp_mesh.compute_vertex_normals()  # 法線計算
o3d.visualization.draw_plotly([fp_mesh], mesh_show_wireframe=True)  # メッシュをフレーム付きで表示
[ ]:
# メッシュポリゴンから点群への変換
fp_point = fp_mesh.sample_points_uniformly(number_of_points=10000)  # メッシュからポイントデータ作成
o3d.visualization.draw_plotly([fp_point]) # ポイントデータ表示
[ ]:
# 点数のポイントを減らす
fp_point_down = fp_point.voxel_down_sample(voxel_size=0.001)  # ポイントデータを間引き
o3d.visualization.draw_plotly([fp_point_down], width=640, height=400)  # 間引きしたポイントデータを表示. 表示サイズを指定
[ ]:
# 移動:並進移動
def translate(mesh):
    mesh_t = copy.deepcopy(mesh).translate([10, 10, 10])  # データをコピーして、X,Y,Zの移動量を設定
    o3d.visualization.draw_plotly([mesh, mesh_t])  # 元データと移動したデータを並べて表示

translate(fp_mesh)  # メッシュデータを移動表示
[ ]:
# 回転:軸角度からデータを回転
# メッシュデータを表示
def rotate_axis(mesh):
    mesh_r = copy.deepcopy(mesh).translate((10, 0, 0))  # 並べ表示用するために、移動量を指定してコピー
    rotation_matrix = o3d.geometry.get_rotation_matrix_from_axis_angle([np.radians(90), 0, 0]) # 回転行列に変換
    mesh_r.rotate(rotation_matrix) # データ回転
    o3d.visualization.draw_plotly([mesh, mesh_r]) # 元データと回転したデータを表示

rotate_axis(fp_mesh)  # メッシュデータを回転表示
[ ]:
# 回転:オイラー角を使用してデータを回転
# ポイントデータを表示
def rotate_xyz(mesh):
    mesh_r = copy.deepcopy(mesh).translate((10, 0, 0))  # 並べ表示用するために、移動量を指定してコピー
    rotation_matrix = o3d.geometry.get_rotation_matrix_from_xyz((0, np.pi / 2, 0))  # 回転行列に変換
    mesh_r.rotate(rotation_matrix) # 回転
    mesh.paint_uniform_color([0.5, 0.0, 0.0])      # 元データを赤表示
    mesh_r.paint_uniform_color([0.0, 0.5, 0.0])    # 回転データを緑表示
    o3d.visualization.draw_plotly([mesh, mesh_r])  # 元データと回転したデータを表示

rotate_xyz(fp_point)  # ポイントデータを回転表示
[ ]:
# スケール: データを拡大・縮小
def scale(mesh):
    mesh_s = copy.deepcopy(mesh).translate((10, 0, 0))  # 並べ表示用するために、移動量を指定してコピー
    mesh_s.scale(0.5, center=mesh_s.get_center())   # メッシュデータの中心を軸に、スケールデータ作成
    o3d.visualization.draw_plotly([mesh, mesh_s])   # 元データとスケールしたデータを表示

scale(fp_mesh)  # メッシュデータをスケール表示
[ ]:
# 転換[変換]: 同次変換行列して、回転と並進移動
def transform(mesh):
    T = np.eye(4)   # 単位行列
    T[:3, :3] = o3d.geometry.get_rotation_matrix_from_xyz((np.pi, 0, 0))  # 回転行列
    T[0, 3] = 10   # Xの移動量
    T[1, 3] = 5    # Yの移動量
    print(T)  # 変換行列を表示
    mesh_t = copy.deepcopy(mesh).transform(T)   # 回転と並進移動したデータをコピー
    o3d.visualization.draw_plotly([mesh, mesh_t])  # 元データと変換したデータを表示

transform(fp_mesh)  # メッシュデータを変換表示
[[ 1.0000000e+00  0.0000000e+00  0.0000000e+00  1.0000000e+01]
 [ 0.0000000e+00 -1.0000000e+00 -1.2246468e-16  5.0000000e+00]
 [ 0.0000000e+00  1.2246468e-16 -1.0000000e+00  0.0000000e+00]
 [ 0.0000000e+00  0.0000000e+00  0.0000000e+00  1.0000000e+00]]